80 INPUT "Enter largest number to be factored";NUMBER
90 IF NUMBER<2 THEN PRINT "NUMBER MUST BE LARGER THAN 1":GOTO 80
100 REM FIRST, FIND THE NECESSARY PRIMES. FLAG.ARRAY WILL FLAG NONPRIME (COMPOSITE) NUMBERS, PRIME ARRAY WILL HOLD PRIMES WHEN FOUND. SOME BASICS REQUIRE SHORTER VARIABLE NAMES.
110 REM SIEVE ALGORITHM PROVIDED BY WILLIAM F. DOSSETT OF AUSTIN,TX.
120 DIM FLAG.ARRAY(NUMBER),PRIME(NUMBER)
130 COMPOSITE=-1 'NONPRIME FLAG.ARRAY ELEMENT WILL BE GIVEN TRUTH-VALUE `T'
140 INDEX=1 'SUBSCRIPT OF LARGEST NONEMPTY ENTRY IN PRIME ARRAY
150 PRIME(INDEX)=2 'DECLARE 2 PRIME AND LIMIT PRIME SEARCH TO ODD NUMBERS
160 REM AVOID UNNECESSARY DUPLICATION IN SEARCH. FIRST NONPRIME ODD NUMBER IS 9 (3 SQUARED), FIRST COMPOSITE ODD NUMBER NOT DIVISIBLE BY 3 IS 25 (5 SQUARED), ETC.
170 FOR K=3 TO SQR(NUMBER) STEP 2
180 IF FLAG.ARRAY(K) THEN 220 'SKIP TO NEXT PRIME
190 FOR I=K*K TO NUMBER STEP K+K 'FLAG THE ODD NUMBERS IT DIVIDES
200 FLAG.ARRAY(I)=COMPOSITE
210 NEXT
220 NEXT
230 INPUT "Do you want a listing of the primes found (y/n)";PRIMEPRINT$
240 IF PRIMEPRINT$="y" THEN PRIMEPRINT$="Y"
250 REM COPY ALL PRIMES FOUND TO PRIME ARRAY, PRINT PRIMES IF SO REQUESTED IN 230.
260 FOR I=3 TO NUMBER STEP 2
270 IF NOT FLAG.ARRAY(I) THEN INDEX=INDEX+1:PRIME(INDEX)=I:IF PRIMEPRINT$= "Y" THEN PRINT PRIME(INDEX);
280 NEXT
290 PRINT:PRINT
300 PRIME(INDEX+1)=NUMBER+1 'MARK END OF PRIME ARRAY IN CASE NUMBER IS PRIME
310 MAXNUMBER=NUMBER 'SAVE VALUE OF LARGEST NUMBER GUARANTEED FACTORABLE WITH CURRENT PRIMES LIST.
320 DIVISORS=1 'INITIALIZE NUMBER OF DIVISORS COUNTER
330 SUBSCRIPT=1 'ACTIVE ELEMENT OF PRIME ARRAY
340 PRIME=PRIME(SUBSCRIPT)
350 REM PRINT UNIQUE FACTORING OF NUMBER
360 PRINT NUMBER;" CAN BE UNIQUELY FACTORED AS:"
370 REM IF YOUR BASIC DOES NOT SUPPORT `WHILE...WEND', CHANGE LINE 380 TO: IF PRIME>NUMBER THEN 480.
380 WHILE PRIME<=NUMBER
390 REM WHAT POWER OF THE ACTIVE PRIME IS A FACTOR OF THE NUMBER? NOTE THAT, ALTHOUGH ALL VARIABLES HAVE BEEN DECLARED INTEGER, NUMBER/PRIME NEED NOT HAVE AN INTEGER VALUE.
400 IF NUMBER/PRIME=INT(NUMBER/PRIME) THEN EXPONENT=EXPONENT+1: NUMBER=NUMBER/PRIME:GOTO 400
410 REM PRINT THE RUNNING RESULTS, INCREMENT DIVISORS
420 IF EXPONENT>0 THEN PRINT "(";PRIME;"TO THE";EXPONENT;")";: DIVISORS=DIVISORS*(EXPONENT+1)
430 REM RESET POWER COUNTER, LOOP
440 EXPONENT=0
450 SUBSCRIPT=SUBSCRIPT+1:PRIME=PRIME(SUBSCRIPT)
460 WEND
470 REM IF YOUR BASIC DOES NOT SUPPORT `WHILE...WEND', CHANGE LINE 460 TO: GOTO 380
480 PRINT:PRINT "NUMBER OF DIVISORS =";DIVISORS
490 PRINT :PRINT
500 REM IF MORE NUMBERS ARE TO BE FACTORED, DETERMINE WHETHER THE CURRENT PRIMES LIST IS ADEQUATE. IF SO, USE IT. IF NOT, ERASE ARRAYS TO AVOID PROGRAM CRASH AND RECALCULATE PRIMES.
510 INPUT "Do you want to factor another number (y/n)";CHOICE$
520 IF CHOICE$<>"y" AND CHOICE$<>"Y" THEN 560
530 CLS
540 INPUT "Enter the new number to be factored";NUMBER
550 IF NUMBER<=MAXNUMBER THEN 320 ELSE ERASE FLAG.ARRAY,PRIME:GOTO 120